package com.styletransfer.mapper;

import com.styletransfer.model.Tag;
import org.apache.ibatis.annotations.*;

import java.util.List;

/**
 * 标签Mapper接口
 * 
 * 这个接口定义了与标签表相关的数据库操作方法。
 * 使用MyBatis的注解方式，可以直接在接口方法上编写SQL语句。
 */
@Mapper
public interface TagMapper {
    
    /**
     * 根据ID查询标签
     * 
     * @param id 标签ID
     * @return 标签对象
     */
    @Select("SELECT * FROM tag WHERE id = #{id}")
    Tag findById(Long id);
    
    /**
     * 根据名称查询标签
     * 
     * @param name 标签名称
     * @return 标签对象
     */
    @Select("SELECT * FROM tag WHERE name = #{name}")
    Tag findByName(String name);
    
    /**
     * 插入标签
     * 
     * @param tag 标签对象
     * @return 影响的行数
     */
    @Insert("INSERT INTO tag(name, description, createTime, updateTime) " +
            "VALUES(#{name}, #{description}, #{createTime}, #{updateTime})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(Tag tag);
    
    /**
     * 更新标签
     * 
     * @param tag 标签对象
     * @return 影响的行数
     */
    @Update("UPDATE tag SET name = #{name}, description = #{description}, updateTime = #{updateTime} " +
            "WHERE id = #{id}")
    int update(Tag tag);
    
    /**
     * 删除标签
     * 
     * @param id 标签ID
     * @return 影响的行数
     */
    @Delete("DELETE FROM tag WHERE id = #{id}")
    int delete(Long id);
    
    /**
     * 查询所有标签
     * 
     * @return 标签列表
     */
    @Select("SELECT * FROM tag ORDER BY id DESC")
    List<Tag> findAll();
    
    /**
     * 查询风格的标签
     * 
     * @param styleId 风格ID
     * @return 标签列表
     */
    @Select("SELECT t.* FROM tag t " +
            "INNER JOIN style_tag st ON t.id = st.tag_id " +
            "WHERE st.style_id = #{styleId}")
    List<Tag> findByStyle(Long styleId);
    
    /**
     * 添加风格标签关联
     * 
     * @param styleId 风格ID
     * @param tagId 标签ID
     * @return 影响的行数
     */
    @Insert("INSERT INTO style_tag(style_id, tag_id) VALUES(#{styleId}, #{tagId})")
    int addStyleTag(@Param("styleId") Long styleId, @Param("tagId") Long tagId);
    
    /**
     * 删除风格标签关联
     * 
     * @param styleId 风格ID
     * @param tagId 标签ID
     * @return 影响的行数
     */
    @Delete("DELETE FROM style_tag WHERE style_id = #{styleId} AND tag_id = #{tagId}")
    int removeStyleTag(@Param("styleId") Long styleId, @Param("tagId") Long tagId);
    
    /**
     * 删除风格的所有标签关联
     * 
     * @param styleId 风格ID
     * @return 影响的行数
     */
    @Delete("DELETE FROM style_tag WHERE style_id = #{styleId}")
    int removeAllStyleTags(Long styleId);
    
    /**
     * 搜索标签
     * 
     * @param keyword 关键词
     * @return 标签列表
     */
    @Select("SELECT * FROM tag WHERE name LIKE CONCAT('%', #{keyword}, '%') OR description LIKE CONCAT('%', #{keyword}, '%') ORDER BY id DESC")
    List<Tag> search(String keyword);
    
    /**
     * 查询热门标签
     * 
     * @param limit 限制数
     * @return 标签列表
     */
    @Select("SELECT t.*, COUNT(st.style_id) as styleCount FROM tag t " +
            "INNER JOIN style_tag st ON t.id = st.tag_id " +
            "GROUP BY t.id " +
            "ORDER BY styleCount DESC " +
            "LIMIT #{limit}")
    List<Tag> findHot(Integer limit);
}
